#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#include <time.h>
#include "trie.h"

/* Transforma a string em caracteres minusculos */
char * strToAlnumLower (char * str)
{
    char * it = str;
    while (*it != '\0')
    {
        if (*it <= 'Z')
            *it += 32; /* 'a'-'A' = 32 */
        it++;
    }
    return str;
}

int main (int argc, char ** argv)
{

	const char * filename;
	int i, j, len, generated = 0, totalwords;
	char str[100];
	char str2[6];
	clock_t t1, t2;
	FILE * f;
	trie T;

	t1 = clock();

	/* Verifica se os parâmetros estão corretos */
	if (argc != 2)
	{
		fprintf(stderr, "USO: %s texto_de_entrada.txt\n", argv[0]);
		return EXIT_FAILURE;
	}

	/* Cria a estrutura de dados para guardar as palavras */
	TrieCreate(&T);

	/* Nome do arquivo de texto para leitura */
	filename = argv[1];

	/* Abre o arquivo para leitura */
	f = fopen(filename, "rw");

	/* Lê as palavras e as insere na estrutura de dados */
	while(fscanf(f, "%[a-zA-Z]%*[^a-zA-Z]", str) != EOF)
	{
		len = strlen(str);
		if (len > 1)
		{
			/* Se a palavra tiver mais que 1 letra e tiver resto 1 na divisão por 5 */
			/* significa que a última parte ficará com 1 letra, o que não é permitido. */
			/* Então a primeira parte terá 4 letras e a última ficará com 2 letras. */
			if (len % 5 == 1)
			{
				for (i = 0; i < 4; i++)
					str2[i] = str[i];
				str2[i] = '\0';
				TrieAdd(&T, strToAlnumLower(str2));
				i = 4;
			}
			else
				i = 0;
			for (j = 0; i < len; i++, j++)
			{
				str2[j] = str[i];
				if (j == 4 || i+1 == len)
				{
					str2[j+1] = '\0';
					TrieAdd(&T, strToAlnumLower(str2));
					j = -1;
				}
			}
		}
		else
			TrieAdd(&T, strToAlnumLower(str));
	}

	totalwords = T.words;

	srand(time(NULL));

	int goal = 90;
	
	while (T.words)
	{
		if (T.words*100/totalwords == goal)
		{
			t2 = clock() - t1;
			printf("%3d%% \t (%lf)\n", 90-goal, (double)t2/(double)CLOCKS_PER_SEC);
			goal -= 10;
		}
		
		for (i = 0; i < 5; i++)
			str2[i] = rand()%26+'a';
		str2[i] = '\0';
		generated++;
		TrieRemove(&T, str2);
	}
	t2 = clock() - t1;
	printf("100%% \t (%lf)\n%d Palavras\n%d Tentativas\n", (double)t2/(double)CLOCKS_PER_SEC, totalwords, generated);
	
	TrieDestroy(&T);
	
	return EXIT_SUCCESS;
}
